//package net.jjjshop.common.service.lbt.impl;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import net.jjjshop.common.constants.BrokerageRecordConstants;
//import net.jjjshop.common.constants.ConfConstants;
//import net.jjjshop.common.entity.lbt.*;
//import net.jjjshop.common.entity.user.User;
//import net.jjjshop.common.mapper.lbt.UserExtractMapper;
//import net.jjjshop.common.service.lbt.LbUserWalletService;
//import net.jjjsh op.common.service.lbt.UserBillService;
//import net.jjjshop.common.service.lbt.UserExtractService;
//import net.jjjshop.common.service.user.UserService;
//import net.jjjshop.common.util.DateUtil;
//import net.jjjshop.common.vo.dateLimitUtilVo;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.support.TransactionTemplate;
//
//import javax.annotation.Resource;
//import java.math.BigDecimal;
//import java.util.List;
//
//import static java.math.BigDecimal.ZERO;
//
//@Service
//public class UserExtractServiceImpl extends ServiceImpl<UserExtractMapper, UserExtractEntity> implements UserExtractService {
//
//    @Resource
//    private UserExtractMapper dao;
//
//    @Autowired
//    private UserService userService;
//    @Autowired
//    private LbUserWalletService userWalletService;
//    @Autowired
//    private UserBillService userBillService;
//
////    @Autowired
////    private SystemConfigService systemConfigService;
////
////    @Autowired
////    private SystemAttachmentService systemAttachmentService;
//
//    @Autowired
//    private TransactionTemplate transactionTemplate;
//
////    @Autowired
////    private UserBrokerageRecordService userBrokerageRecordService;
//
//
//    /**
//     * 列表
//     * @param request 请求参数
//     * @author Mr.Zhang
//     * @since 2020-05-11
//     * @return List<UserExtract>
//     */
//    @Override
//    public IPage<UserExtract> getList(UserExtractSearchRequest request, Integer page, Integer limit) {
//        Page<UserExtract> pageUser = new Page<UserExtract>(page, limit);
//        //带 UserExtract 类的多条件查询
//        LambdaQueryWrapper<UserExtract> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        if (!StringUtils.isBlank(request.getKeywords())) {
//            lambdaQueryWrapper.and(i -> i.
//                    or().like(UserExtract::getWechat, request.getKeywords()).   //微信号
//                            or().like(UserExtract::getRealName, request.getKeywords()). //名称
//                            or().like(UserExtract::getBankCode, request.getKeywords()). //银行卡
//                            or().like(UserExtract::getBankAddress, request.getKeywords()). //开户行
//                            or().like(UserExtract::getAlipayCode, request.getKeywords()). //支付宝
//                            or().like(UserExtract::getFailMsg, request.getKeywords()) //失败原因
//            );
//        }
//
//        //提现状态
//        if (request.getStatus() != null) {
//            lambdaQueryWrapper.eq(UserExtractEntity::getStatus, request.getStatus());
//        }
//
//        //提现方式
//        if (!StringUtils.isBlank(request.getExtractType())) {
//            lambdaQueryWrapper.eq(UserExtractEntity::getExtractType, request.getExtractType());
//        }
//
//        //时间范围
//        if (StringUtils.isNotBlank(request.getDateLimit())) {
//            dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit());
//            lambdaQueryWrapper.between(UserExtractEntity::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime());
//        }
//
//        //按创建时间降序排列
//        lambdaQueryWrapper.orderByDesc(UserExtractEntity::getCreateTime, UserExtract::getId);
//
//        IPage<UserExtract> extractList = dao.selectPage(pageUser,lambdaQueryWrapper);
//
//        return extractList;
//    }
//
//    /**
//     * 提现总金额
//     * 总佣金 = 已提现佣金 + 未提现佣金
//     * 已提现佣金 = 用户成功提现的金额
//     * 未提现佣金 = 用户未提现的佣金 = 可提现佣金 + 冻结佣金 = 用户佣金
//     * 可提现佣金 = 包括解冻佣金、提现未通过的佣金 = 用户佣金 - 冻结期佣金
//     * 待提现佣金 = 待审核状态的佣金
//     * 冻结佣金 = 用户在冻结期的佣金，不包括退回佣金
//     * 退回佣金 = 因退款导致的冻结佣金退回
//     */
//    @Override
//    public BalanceResponse getBalance(String dateLimit) {
//        String startTime = "";
//        String endTime = "";
//        if (StringUtils.isNotBlank(dateLimit)) {
//            dateLimitUtilVo dateRage = DateUtil.getDateLimit(dateLimit);
//            startTime = dateRage.getStartTime();
//            endTime = dateRage.getEndTime();
//        }
//        userWalletService.getSum("money");
//
//        // 已提现
//        BigDecimal withdrawn = getWithdrawn(startTime, endTime);
//        // 待提现(审核中)
//        BigDecimal toBeWithdrawn = getWithdrawning(startTime, endTime);
//        // 拒绝
//        BigDecimal refuseWithdrawn = getRefuseWithdrawn(startTime, endTime);
//
//
//
//        return new BalanceResponse(withdrawn, null, refuseWithdrawn, toBeWithdrawn);
//    }
//
//
//    /**
//     * 提现总金额
//     * @author Mr.Zhang
//     * @since 2020-05-11
//     * @return BalanceResponse
//     */
//    @Override
//    public BigDecimal getWithdrawn(String startTime, String endTime) {
//        return getSum(null, 1, startTime, endTime);
//    }
//
//    /**
//     * 审核中总金额
//     * @author Mr.Zhang
//     * @since 2020-05-11
//     * @return BalanceResponse
//     */
//    private BigDecimal getWithdrawning(String startTime, String endTime) {
//        return getSum(null, 0, startTime, endTime);
//    }
//    /**
//     * 审核未通过总金额
//     */
//    private BigDecimal getRefuseWithdrawn(String startTime, String endTime) {
//        return getSum(null, -1, startTime, endTime);
//    }
//
//
//    /**
//     * 根据状态获取总额
//     * @return BigDecimal
//     */
//    private BigDecimal getSum(Integer userId, int status, String startTime, String endTime) {
//        LambdaQueryWrapper<UserExtract> lqw = Wrappers.lambdaQuery();
//        if (null != userId) {
//            lqw.eq(UserExtract::getUid,userId);
//        }
//        lqw.eq(UserExtract::getStatus,status);
//        if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
//            lqw.between(UserExtract::getCreateTime, startTime, endTime);
//        }
//        List<UserExtract> userExtracts = dao.selectList(lqw);
//        BigDecimal sum = ZERO;
//        if (CollUtil.isNotEmpty(userExtracts)) {
//            sum = userExtracts.stream().map(UserExtract::getExtractPrice).reduce(ZERO, BigDecimal::add);
//        }
//        return sum;
//    }
//
//    /**
//     * 获取用户对应的提现数据
//     * @param userId 用户id
//     * @return 提现数据
//     */
//    @Override
//    public UserExtractResponse getUserExtractByUserId(Integer userId) {
//        QueryWrapper<UserExtract> qw = new QueryWrapper<>();
//        qw.select("SUM(extract_price) as extract_price,count(id) as id, uid");
//        qw.ge("status", 1);
//        qw.eq("uid",userId);
//        qw.groupBy("uid");
//        UserExtract ux = dao.selectOne(qw);
//        UserExtractResponse uexr = new UserExtractResponse();
////        uexr.setEuid(ux.getUid());
//        if (null != ux) {
//            uexr.setExtractCountNum(ux.getId()); // 这里的id其实是数量，借变量传递
//            uexr.setExtractCountPrice(ux.getExtractPrice());
//        }else{
//            uexr.setExtractCountNum(0); // 这里的id其实是数量，借变量传递
//            uexr.setExtractCountPrice(ZERO);
//        }
//
//        return uexr;
//    }
//
//    /**
//     * 提现审核
//     *
//     * @param id          提现申请id
//     * @param status      审核状态 -1 未通过 0 审核中 1 已提现
//     * @param backMessage 驳回原因
//     * @return 审核结果
//     */
//    @Override
//    public Boolean updateStatus(Integer id, Integer status, String backMessage) {
//        if (status == -1 && StringUtils.isBlank(backMessage))
//            throw new RuntimeException("驳回时请填写驳回原因");
//
//        UserExtract userExtract = getById(id);
//        if (ObjectUtil.isNull(userExtract)) {
//            throw new RuntimeException("提现申请记录不存在");
//        }
//        if (userExtract.getStatus() != 0) {
//            throw new RuntimeException("提现申请已处理过");
//        }
//        userExtract.setStatus(status);
//
//        User user = userService.getById(userExtract.getUid());
//        if (ObjectUtil.isNull(user)) {
//            throw new RuntimeException("提现用户数据异常");
//        }
//
//        Boolean execute = false;
//
//        userExtract.setUpdateTime(cn.hutool.core.date.DateUtil.date());
//        // 拒绝
//        if (status == -1) {//未通过时恢复用户总金额
//            userExtract.setFailMsg(backMessage);
//            // 添加提现申请拒绝佣金记录
//            UserBrokerageRecord brokerageRecord = new UserBrokerageRecord();
//            brokerageRecord.setUid(user.getUserId());
//            brokerageRecord.setLinkId(userExtract.getId().toString());
//            brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW);
//            brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD);
//            brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_FAIL);
//            brokerageRecord.setPrice(userExtract.getExtractPrice());
////            brokerageRecord.setBalance(user.getBrokeragePrice().add(userExtract.getExtractPrice()));
//            brokerageRecord.setMark(StrUtil.format("提现申请拒绝返还佣金{}", userExtract.getExtractPrice()));
//            brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE);
//            brokerageRecord.setCreateTime(DateUtil.nowDateTime());
//
//            execute = transactionTemplate.execute(e -> {
//                // 返还佣金
//               // userService.operationBrokerage(userExtract.getUid(), userExtract.getExtractPrice(), user.getBrokeragePrice(), "add");
//                userWalletService.operationMoney(userExtract.getExtractPrice(), userExtract.getUid(), "add");
//                userBillService.addBillRecord("提现申请拒绝返还佣金", ConfConstants.COMMISSION_TYPE,1,userExtract.getExtractPrice(),userExtract.getUid(),null);
//                updateById(userExtract);
//
//                return Boolean.TRUE;
//            });
//        }
//
//        // 同意
//        if (status == 1) {
//
//
//            execute = transactionTemplate.execute(e -> {
//                updateById(userExtract);
//
//                return Boolean.TRUE;
//            });
//        }
//        return execute;
//    }
//
//    /**
//     * 获取提现记录列表
//     * @param userId 用户uid
//     * @return PageInfo
//     */
//    @Override
//    public IPage<UserExtract> getExtractRecord(Integer userId, Integer page, Integer limit) {
//        Page<UserExtract> userExtractPage = new Page<UserExtract>(page, limit);
//
//        QueryWrapper<UserExtract> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("uid", userId);
//
//        queryWrapper.groupBy("left(create_time, 7)");
//        queryWrapper.orderByDesc("left(create_time, 7)");
//        IPage<UserExtract> list = dao.selectPage(userExtractPage,queryWrapper);
//
//        return list;
//    }
//
//    private List<UserExtract> getListByMonth(Integer userId, String date) {
//        QueryWrapper<UserExtract> queryWrapper = new QueryWrapper<>();
//        queryWrapper.select("id", "extract_price", "status", "create_time", "update_time","real_name",
//                "extract_type", "bank_code", "extract_type", "fail_msg", "rate", "real_money", "card_id","bank_name");
//        queryWrapper.eq("uid", userId);
//        queryWrapper.apply(StrUtil.format(" left(create_time, 7) = '{}'", date));
//        queryWrapper.orderByDesc("create_time");
//        return dao.selectList(queryWrapper);
//    }
//
//    /**
//     * 获取用户提现总金额
//     * @param userId 用户uid
//     * @return BigDecimal
//     */
//    @Override
//    public BigDecimal getExtractTotalMoney(Integer userId) {
//        return getSum(userId, 1, null, null);
//    }
//
//
//    /**
//     * 提现申请
//     * @return Boolean
//     */
//    @Override
//    public Boolean extractApply(UserExtractRequest request) {
//        return true;
//    }
//
//    /**
//     * 修改提现申请
//     * @param id 申请id
//     * @param userExtractRequest 具体参数
//     */
//    @Override
//    public Boolean updateExtract(Integer id, UserExtractRequest userExtractRequest) {
//        UserExtract userExtract = new UserExtract();
//        BeanUtils.copyProperties(userExtractRequest, userExtract);
//        userExtract.setId(id);
//        return updateById(userExtract);
//    }
//
//    /**
//     * 提现申请待审核数量
//     * @return Integer
//     */
//    @Override
//    public Integer getNotAuditNum() {
//        LambdaQueryWrapper<UserExtract> lqw = Wrappers.lambdaQuery();
//        lqw.eq(UserExtract::getStatus, 0);
//        return dao.selectCount(lqw);
//    }
//
//    /**
//     * 获取产品列表Admin
//     * @param request 筛选参数
//     * @return PageInfo
//     */
//    @Override
//    public List<UserExtract> getExcelList(UserExtractSearchRequest request, Integer page, Integer limit) {
//        //带 StoreProduct 类的多条件查询
//        LambdaQueryWrapper<UserExtract> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        if (request.getStartTime() != null && request.getEndTime() != null){
//            lambdaQueryWrapper.ge(UserExtract::getCreateTime, request.getStartTime()+" 00:00:00");
//            lambdaQueryWrapper.le(UserExtract::getCreateTime, request.getEndTime()+" 23:59:59");
//        }
//        if (request.getStatus() != null ){
//            lambdaQueryWrapper.eq(UserExtract::getStatus, request.getStatus());
//        }
//        lambdaQueryWrapper.orderByDesc(UserExtract::getId).orderByDesc(UserExtract::getId);
//        List<UserExtract> storeProducts = dao.selectList(lambdaQueryWrapper);
//
//        return storeProducts;
//    }
//
//
//}
//
